//
///*******************************************************************************************************
// TASK CONTROL BLOCK
///*******************************************************************************************************
///
typedef struct os_tcb
{
OS_STK *OSTCBStkPtr; // Pointer to current top of stack
#if OS_TASK_CREATE_EXT_EN > 0
void *OSTCBExtPtr; // Pointer to user definable data for TCB extension
OS_STK *OSTCBStkBottom; // Pointer to bottom of stack
INT32U OSTCBStkSize; // Size of task stack (in number of stack elements)
INT16U OSTCBOpt; // Task options as passed by OSTaskCreateExt()
INT16U OSTCBId; // Task ID (0..65535)
#endif
//
// Links connecting TCB's into a TCB list
//
struct os_tcb *OSTCBNext; // Pointer to next TCB in the TCB list
struct os_tcb *OSTCBPrev; // Pointer to previous TCB in the TCB list
#if OS_EVENT_EN || (OS_FLAG_EN > 0)
OS_EVENT *OSTCBEventPtr; // Pointer to event control block
#endif
#if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)
void *OSTCBMsg; // Message received from OSMboxPost() or OSQPost()
#endif
#if (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
#if OS_TASK_DEL_EN > 0
OS_FLAG_NODE *OSTCBFlagNode; // Pointer to event flag node
#endif
OS_FLAGS OSTCBFlagsRdy; // Event flags that made task ready to run
#endif
INT16U OSTCBDly; // Nbr ticks to delay task or, timeout waiting for event
INT8U OSTCBStat; // Task status
INT8U OSTCBStatPend; // Task PEND status
INT8U OSTCBPrio; // Task priority (0 == highest)
INT8U OSTCBX; // Bit position in group corresponding to task priority
INT8U OSTCBY; // Index into ready table corresponding to task priority
#if OS_LOWEST_PRIO <= 63
INT8U OSTCBBitX; // Bit mask to access bit position in ready table
INT8U OSTCBBitY; // Bit mask to access bit position in ready group
#else
INT16U OSTCBBitX; // Bit mask to access bit position in ready table
INT16U OSTCBBitY; // Bit mask to access bit position in ready group
#endif
#if OS_TASK_DEL_EN > 0
INT8U OSTCBDelReq; // Indicates whether a task needs to delete itself
#endif
#if OS_TASK_PROFILE_EN > 0
INT32U OSTCBCtxSwCtr; // Number of time the task was switched in
INT32U OSTCBCyclesTot; // Total number of clock cycles the task has been running
INT32U OSTCBCyclesStart; // Snapshot of cycle counter at start of task resumption
OS_STK *OSTCBStkBase; // Pointer to the beginning of the task stack
INT32U OSTCBStkUsed; // Number of bytes used from the stack
#endif
#if OS_TASK_NAME_SIZE > 1
INT8U OSTCBTaskName[OS_TASK_NAME_SIZE];
#endif
} OS_TCB;